我Java作业中出现了两个错误

3

这是我的当前代码:

import java.lang.String;
import java.io.*;

class InvalidAgeException extends Exception
{
    public InvalidAgeException()
    {
        super("The age you entered is not between 0 and 125");
    }
}

public class questionOne
{
    public static void main(String args[])
    {
        System.out.println("What is your name?");

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String name;

        try
        {
            name = br.readLine();
        }
        catch(IOException e)
        {
            System.out.println("Error: " + e);
            System.exit(1);
        }

        System.out.println("Hello " + name + ", how old are you?");

        String i;
        int age;

        try
        {
            i = br.readLine();
            age = Integer.valueOf(i);
        }
        catch(IOException e)
        {
            System.out.println("Error: " + e);
            System.exit(1);
        }
        catch(InvalidAgeException e)
        {
            System.out.println("Error: " + e);
            System.exit(1);
        }
        finally
        {
            System.out.println("No errors found.");
        }
    }
}

这个任务是编写一个程序,要求用户输入姓名和年龄,如果年龄不在0到125之间,则抛出异常。我的代码出现了两个错误:

questionOne.java:31: variable name might not have been initialized
    System.out.println("Hello " + name + ", how old are you?");
                                  ^
questionOne.java:46: exception InvalidAgeException is never thrown in body of corresponding try statement
    catch(InvalidAgeException e)
    ^
2 errors

我不确定如何修复它们。

1
我正在添加一个答案,然后弹出一个窗口说已经添加了10个新答案... - fire.eagle
谢谢大家,我对异常还不太熟悉,有点困惑哈哈。 - user768417
1
@fire 这并没有阻止其他人发布 #11。 - Michael Mrozek
你是不是想说它们有点让你困扰? :P - Cooper
9个回答

3

你的第一个错误是因为从未初始化名称。请记住,它仅在Try Catch块内初始化,这会导致编译器抛出错误,因为它可能永远不会在程序中初始化。因此,将上面的行更改为Try Catch块之前。

String name = "";

将解决该错误。

编辑:

这可能是你需要在try catch块之外执行的操作。

if (age < 0 || age > 125){
    throw new InvalidAgeException();
}

2
questionOne.java:31: variable name might not have been initialized
    System.out.println("Hello " + name + ", how old are you?");  

函数内部的变量在使用之前需要进行初始化。当你尝试在函数内部使用未初始化的变量时,编译器会抛出异常。

因此,请尝试使用以下代码:

String name = " ";

questionOne.java:46: exception InvalidAgeException is never thrown in body of corresponding try statement
    catch(InvalidAgeException e)  

你没有在任何地方抛出 InvalidAgeException (因此编译器发出了警告)。尝试这样做:
  if (age < 0 || age > 125){
    throw new InvalidAgeException("This is an invalid age :" + age);
}

0

它们都可以为您提供解决方案。只需将变量初始化为某个值:

String name = null;

对于第二个问题,没有人抛出异常。在执行readline之后进行检查,如果解析的值小于0或大于125,则执行以下操作:

throw new InvalidAgeException();

0

你可以通过将声明更改为以下内容来消除第一个错误:

String name = new String();

它在抱怨,因为它看到了一条代码路径,其中名称没有被分配。(例如,如果readLine()抛出的不是IOException)。

第二个错误是因为您没有在任何地方抛出InvalidAgeException,所以它认为您不需要那个catch块。


2
为什么要使用 new String() 而不是 "" - Peter Lawrey
为什么要创建 new String( ); 对象,当简单的 String name = ""; 就能完成同样的工作呢? - Saurabh Gokhale
风格上的差异,而不是语义上的差异。(当您将空字符串文字转换为String对象时,String对象将被创建) - jwismar

0
我建议您尝试简化代码。你写的代码越多,越难看出程序实际上在做什么...
public static void main(String... args) throws IOException, InvalidAgeException {
    System.out.println("What is your name?");
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String name = br.readLine();
    System.out.println("Hello " + name + ", how old are you?");
    int age = Integer.parseInt(br.readLine());
    if (age < 0 || age > 125)
        throw new InvalidAgeException();
    System.out.println("No errors found, you are " + age + " years old");
}

0

你可以这样做:String name="";

年龄也需要初始化。

当你获取年龄时,需要进行检查,如果超出范围,就抛出异常,它不会自动为你处理。


0

初始化名称。编译器并不聪明到知道当你按下System.exit(1)时程序将终止。

在您的try块中没有任何执行代码会抛出InvalidAgeException,因此它是不必要的,至少现在是这样的。

编译器具有非常描述性的消息。


0
第一个错误很容易解决:将name初始化为null或为空。
第二个错误实际上是因为您还没有完成作业 ;) 提示:验证在哪里?

0

第一个错误的问题就像编译时的空指针异常。

...
String name; //Name is basically null and compiler does not want to throw a NullPointerException.
...
System.out.println("Hello " + name + ", how old are you?");

请尝试这样做:

String name = "";
...

第二个错误: 基本上,InvalidAgeException 从未被抛出,所以为什么要捕获它呢? 这就是编译器所抱怨的。 你应该在某个地方抛出你的 InvalidAgeException。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接