如何使Java编译器忽略错误/警告

时间:2018-07-04 06:15:58

标签: java

所以我有以下代码:

 public static Image getImage(String filepath, Class cl) {
    try {
        return ImageIO.read(cl.getResource(filepath));
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return null;    // Will never execute
}

这是一个基本的try-catch块。如果我无法读取图像并将其退还,我将立即进入catch块。但是,由于我的返回值在try块的范围内,而不是在整个函数的范围内,因此,当我尝试编译并运行时,编译器会发出错误消息,因为它认为有可能我从未命中过return语句。因此,我添加了return null;行以禁止显示此警告,但是我宁愿使用一种更整洁的方式来执行此操作,而不必放置永远不会运行的代码。我尝试添加

@SuppressWarnings("all")

对于我的代码,但是它仍然给我一个错误。有任何想法吗?我觉得应该有一种方法告诉编译器忽略这样的错误。

如果有什么用,我正在使用IntelliJ作为我的IDE。

2 个答案:

答案 0 :(得分:0)

我会建议@LuCio在评论中急于想说些什么。只是不要捕获异常并将其向上传递:

public static Image getImage(String filePath, Class<?> clazz) throws IOException {
    return ImageIO.read(clazz.getResource(filePath));
}

这样,您就创建了一个简单的帮助器方法。如果返回null,则必须在JavaDoc中进行记录,并且每个调用者都必须使用not-null断言逻辑,然后如果错误为null则抛出错误。

try catch块执行相同的操作。因此,您无需向上传播null,而是向上传播异常。您在某处说过要将图像分配给静态字段,因此您可以轻松地做到这一点:

static {
    try {
         MY_IMAGE = getImage("somepath", MyClass.class);
    } catch(IOException e){
        throw new IOError(e); // will kill the Vm with an error
    }
}

但是也许在某个地方您还有其他动作。比只是杀死VM。也许使用默认图片:

final Image image;
try {
    image = getImage("somepath", MyClass.class);
} catch(IOException e){
    e.printStacktrace();
    image = new SomeDefaultImage();
}

// do something with image

总之,这是要走的路。您无法使用辅助方法来确定失败时的处理方法。这应该始终由调用代码完成。

答案 1 :(得分:-1)

好吧,我相信我混淆了catch块的目的。感谢@Ben和@Zephyr以及其他所有人的帮助。我将代码修改为:

public static Image getImage(String filepath, Class cl) {
    try {
        return ImageIO.read(cl.getResource("hello"));
    } catch (IOException e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
        throw new IOError(e);
    }
}

编辑:经过更多讨论,并查看其他人发布的其他选项,我更新了上面的代码,该代码满足了编译器的要求。请注意,替换行

throw new IOError(e)

使用

System.exit(0);

无法修复错误,因为据我所知,编译器无法在编译时告知程序是否将结束。拥有一种抑制警告的方法将很有帮助,因为我们知道在运行时程序将始终(或实际上始终)结束,但是a @SuppressWarnings毫无用处。