Java 如何使这个if语句为true,从而不捕获异常?
我试图编写一个if语句,既捕获异常又不捕获异常。我捕获了异常,但我无法确定如何使条件为true,以便它不捕获异常并返回所需的值。代码如下: 主要 畜生 食物 肉 狼 输出 它想让我捕获肉类作为一个例外,但我想使肉类不是一个例外,并与if语句中的肉类条件相关,如下所示:Java 如何使这个if语句为true,从而不捕获异常?,java,exception,Java,Exception,我试图编写一个if语句,既捕获异常又不捕获异常。我捕获了异常,但我无法确定如何使条件为true,以便它不捕获异常并返回所需的值。代码如下: 主要 畜生 食物 肉 狼 输出 它想让我捕获肉类作为一个例外,但我想使肉类不是一个例外,并与if语句中的肉类条件相关,如下所示: public Food eat(Food x) throws Exception { if (x instanceof Meat) { return x; } else {
public Food eat(Food x) throws Exception
{
if (x instanceof Meat) {
return x;
} else {
throw new Exception("Carnivores only eat meat!");
}
}
这一点应该是正确的:
Food Meat = new Food("Steak");
System.out.println("Wolves eat " + wolfExample.eat(Meat));
所需的输出将是:
************Wolf Exception example************
java.lang.Exception: Carnivores only eat meat!
************Wolf Non-Exception example************
Wolves eat Meat
我知道我犯了一个错误,但我正在努力想办法解决它,任何帮助都会很好,谢谢。如果一个方法有可能抛出一个选中的异常,这将在其签名中声明。如果调用一个声明可能引发异常的方法,则必须为该异常提供一个处理程序,或者声明您也可以引发该异常。在编写练习时,您碰巧知道在这种情况下不应获得异常,这一事实并不能免除您的这一要求 您需要做的是将调用该方法的代码放在一个try块中,并为选中的异常提供一个catch块,在这种情况下,该方法声明它可能抛出异常。这并不意味着会抛出异常(在本例中不会),但Java坚持知道如果抛出异常,它应该做什么
有些人——特别是Spring社区——并不真正喜欢这种行为,所以他们几乎对所有事情都使用未经检查的异常。未经检查的异常是从RuntimeException或Error派生的异常,尽管Error通常是为更严重的情况保留的。不过,Java最初的设计是确保每个检查过的异常最终都会到达一个处理程序。您没有打印狼群吃肉的原因,但是一个异常是,您仍然需要在每次调用.eat时使用try-catch块,即使您知道不会抛出异常 在打印行之前出现的异常是RuntimeException,因为代码不可编译 这不起作用的第二个原因是,你给狼的肉是食物而不是肉: 这些小小的变化将使它发挥作用:
Food meat = new Meat("Steak"); // you create a Meat object and store it in a Food variable (so to speak)
try{
System.out.println("Wolves eat " + wolfExample.eat(meat)); // must be surrounded by a try-catch block
}catch(Exception ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); // better way to log the exception than ex.printStackTrace();
}
顺便说一句:变量应该以小写字母Food-meat开头,而不是Food-meat。。否则,如何知道Meat是类还是变量
编辑
另一个旁注:您的类Food应该重写toString方法以使其能够正确打印。否则,System.out.printlnmait将以类似com.my.package的形式结束。Meat@5113de03这里的代码太多了。请发表一篇文章,这样你的问题就清楚多了。你有一份带有名称约定的沙拉,为什么eat方法会返回与你作为参数给出的相同的值?只要不要抛出异常,你可以简单地让eat方法返回一个布尔值:如果食物正常,则为true,否则为false。作业的目的是演示例外的使用,因此我别无选择,只能这样做。”。。。“捕获异常和不捕获异常”在术语上是矛盾的。我添加了一个try-and-catch块,但它仍然认为这是一个异常,即使食物被称为肉类,肉类应该返回肉类的价值,而不是抛出异常?谢谢,这很有效,帮助很大。我得到的唯一问题是输出是Wolfs eat QuestionEditor。Meat@6d06d69c是的,请看一下我的编辑——这里的最佳实践是在您的类Food中创建一个公共字符串toString方法,该方法只返回食物或其他东西的名称。然后它会说:狼吃牛排,我可以帮忙。
package QuestionEditor;
public class Wolf extends Carnivore
{
Wolf()
{
name = "Alex";
age = 4;
}
public void makeNoise()
{
noise = "Woof!";
}
public String getNoise()
{
return noise;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public Food eat(Food x) throws Exception
{
if (x instanceof Meat) {
return x;
} else {
throw new Exception("Carnivores only eat meat!");
}
}
}
************Wolf Exception example************
java.lang.Exception: Carnivores only eat meat!
************Wolf Non-Exception example************
at QuestionEditor.Wolf.eat(Wolf.java:34)
at QuestionEditor.Main.main(Main.java:15)
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - unreported exception java.lang.Exception; must be caught or declared to be thrown
at QuestionEditor.Main.main(Main.java:25)
C:\Users\lee-pc\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
public Food eat(Food x) throws Exception
{
if (x instanceof Meat) {
return x;
} else {
throw new Exception("Carnivores only eat meat!");
}
}
Food Meat = new Food("Steak");
System.out.println("Wolves eat " + wolfExample.eat(Meat));
************Wolf Exception example************
java.lang.Exception: Carnivores only eat meat!
************Wolf Non-Exception example************
Wolves eat Meat
Food meat = new Food("Steak"); // no matter what name you give the food, it is still of the class Food
Food meat = new Meat("Steak"); // you create a Meat object and store it in a Food variable (so to speak)
try{
System.out.println("Wolves eat " + wolfExample.eat(meat)); // must be surrounded by a try-catch block
}catch(Exception ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); // better way to log the exception than ex.printStackTrace();
}