有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使此代码不打印负值?

编写代码是为了将十六进制值转换为十进制值,但当我输入一个无效数字(如“S”)时,它会打印出一个负值

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String s = "a1";

    String digits = "0123456789ABCDEF";
    s = s.toUpperCase();
    int val = 0;

    for (int i = 0; i < s.length(); i++)
    {
        char c = s.charAt(i);
        int d = digits.indexOf(c);
        val = 16*val + d;
    }

系统。出来println(“等效dec编号为”+val)


共 (2) 个答案

  1. # 1 楼答案

    如果输入不是十六进制数,则可以引发异常,如下所示:

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        int d = digits.indexOf(c);
        if (d == -1) {
            throw new NumberFormatException("Your input is not an hexadecimal number");
        }
        val = 16 * val + d;
    }
    

    编辑:更好的选择,因此如果输入不是十六进制,for循环根本不会迭代。只需将其放在for循环之前,它就会发现您的输入是否包含不在digits字符串中的字符,并在这种情况下引发异常:

    if (!s.matches("[" + digits + "]+")) {
        throw new NumberFormatException("Your input is not an hexadecimal number");
    }
    
  2. # 2 楼答案

    您有2个选择,添加一个条件

    for (int i = 0; i < s.length(); i++)
    {
        char c = s.charAt(i);
        int d = digits.indexOf(c);
        if (d == -1) {
            val = -1;
            break;
        }
        val = 16*val + d;
    }
    
    if (val == -1) {
        System.out.println("Invalid number");
    } else {
        System.out.println(val);
    }
    

    或者像这样使用java内置转换器

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s = "a1";
        try {
            int val = Integer.parseInt(s, 16);
            System.out.println(val);
        } catch(NumberFormatException ex) {
            System.out.println("Invalid number");
        }  
    }