You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java ISBN检查器报‘cannot find symbol’错误:原因及解决方法咨询

解决ISBN检查器的"cannot find symbol"错误

嘿,我来帮你拆解下你遇到的问题,然后一步步把它修好。

错误原因分析

你碰到的cannot find symbol报错主要是两个核心问题导致的:

  1. 静态方法调用方式错误
    你的isISBN方法是定义在isISBN类里的静态方法,在Main类里直接写isISBN(number)是不符合Java语法的——调用其他类的静态方法时,必须加上类名前缀,也就是isISBN.isISBN(number)。

  2. 缺少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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:31:03