Java ISBN检查器报‘cannot find symbol’错误:原因及解决方法咨询
解决ISBN检查器的"cannot find symbol"错误
嘿,我来帮你拆解下你遇到的问题,然后一步步把它修好。
错误原因分析
你碰到的cannot find symbol报错主要是两个核心问题导致的:
静态方法调用方式错误
你的isISBN方法是定义在isISBN类里的静态方法,在Main类里直接写isISBN(number)是不符合Java语法的——调用其他类的静态方法时,必须加上类名前缀,也就是isISBN.isISBN(number)。缺少Scanner类的导入
你在Main类里用了Scanner来读取用户输入,但没有导入这个类,Java编译器找不到它,也会触发找不到符号的错误。
另外我还发现Main类里有一行多余的代码:int id = Integer.parseInt(scan.nextLine());,这行代码会让用户输入ISBN后还要再输一个整数,但你的逻辑里根本用不上这个变量,反而会导致程序流程出错,应该是个无心的小失误。
修复后的代码
1. isISBN.java保持不变(逻辑部分没问题)
public class isISBN { // 检查号码是否为ISBN的方法 public static boolean isISBN(String number) { // 声明变量 int length = 0; // 移除所有连字符 number = number.replace("-", ""); // 移除所有空格 number = number.replace(" ", ""); // 检查结果字符串是否为数字 try { // 除了ISBN-10以X或x结尾的情况 char ch = number.charAt(9); ch = Character.toUpperCase(ch); if( ch != 'X') { // 不存储,仅检查 Long.parseLong(number); } } catch(NumberFormatException nfe) { // 不是数字 return false; } // 获取长度 length = number.length(); if(length==13) return isISBN13(number); else if(length==10) return isISBN10(number); return false; } // 检查ISBN-10的方法 private static boolean isISBN10(String number) { // 声明变量 int sum = 0; int digit = 0; char ch = '\0'; // 累加至第9位数字 for(int i=1; i<=9; i++) { ch = number.charAt(i-1); digit = Character.getNumericValue(ch); sum += (i* digit); } // 最后一位数字 ch = number.charAt(9); ch = Character.toUpperCase(ch); if(ch =='X') sum += (10*10); else { digit = Character.getNumericValue(ch); sum += (digit * 10); } // 检查总和 if(sum % 11 == 0) return true; return false; } // 检查ISBN-13的方法 private static boolean isISBN13(String number) { // 声明变量 int sum = 0; int multiple = 0; char ch = '\0'; int digit = 0; // 累加数字 for(int i=1; i<=13; i++) { if(i % 2 == 0) multiple = 3; else multiple = 1; // 获取数字字符 ch = number.charAt(i-1); // 转换为数字 digit = Character.getNumericValue(ch); // 累加 sum += (multiple*digit); } // 检查总和 if(sum%10 == 0) return true; return false; } }
2. 修复后的Main.java
// 导入Scanner类,让编译器能找到它 import java.util.Scanner; class Main { public static void main(String[] args) { // 声明变量 String number = null; boolean result = false; // 创建Scanner类对象以获取输入 Scanner scan = new Scanner(System.in); // 获取用户输入 System.out.print("Enter number::"); number = scan.nextLine(); // 移除多余的无效代码,避免流程出错 // 检查号码是否为ISBN:加上类名前缀调用静态方法 result = isISBN.isISBN(number); // 显示结果 if(result) System.out.println(number + " is an ISBN number."); else System.out.println(number + " is not an ISBN number."); // 关闭Scanner对象 scan.close(); } }
额外小建议
- Java类名规范是大驼峰命名(首字母大写),建议把
isISBN类改名为ISBNChecker,这样更符合编码规范,也能避免类名和方法名同名带来的混淆。 - 在
isISBN方法里,可以在移除连字符和空格后先检查长度,提前过滤掉长度不是10或13的无效输入,能稍微提升一点程序效率。
内容的提问来源于stack exchange,提问作者Momo Traore
相关产品推荐
相关产品推荐

