首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在紧凑结构中抛出异常时“未处理的异常类型”(StringConverter大小写)

在紧凑结构中抛出异常时“未处理的异常类型”(StringConverter大小写)
EN

Stack Overflow用户
提问于 2021-04-28 22:43:24
回答 1查看 216关注 0票数 1

我相信这一定是我对语法的无知。

我想要创建一个创建和返回StringConverter对象的方法。问题是,该对象必须在其方法中抛出异常。我相信我一直在失败是因为语法。

我有两个例子,最后一个很好的编译。

看看第一种方法,Eclipse说“未处理的异常类型CharConversionException":

代码语言:javascript
复制
public static StringConverter<String> creditoDebito() {
        return new StringConverter<String>() {
            @Override
            public String fromString(String arg0) {
                switch(arg0.charAt(0)) {
                case 'D':
                case 'd':
                    return "Débito";
                default:
                    throw new CharConversionException();
                }
            }
        }; 
    }

看看其中一个成功的例子,它编译得很好:

代码语言:javascript
复制
public static StringConverter<BigDecimal> numberCellConverter(){
    return new StringConverter<BigDecimal>() {
        @Override
        public BigDecimal fromString(String arg0) {
            Pattern patternDefault = Pattern.compile("\\d*");
            Matcher matcher = patternDefault.matcher(arg0);
            if(matcher.find()) {
                return new BigDecimal(arg0);
            }else {
                throw new NumberFormatException();
            }
        }
    };
}

这两个案子有什么区别?为什么NumberFormatException编译而另一个不编译?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-29 00:59:52

例外不仅仅是一个有趣的名字。您不应该仅仅因为名称听起来不太相关就使用异常。CharConversionException是关于字符集编码和例如XML读取的问题;重点是它扩展了IOException,因此它是一种“输入/输出通道的问题”,在这里不适用。创建您自己的异常类型,或者使用有意设计的一种更通用的异常类型(通过读取javadoc并检查继承),使之更加模糊。例如,这里可以使用IllegalArgumentException (如果参数不以d或d开头,那么它显然是非法的吗?)有点奇怪的方法)。

不同之处在于它是一种例外。

在java中,throwables是checked,这意味着一个方法需要捕获它抛出的所有异常,除非它明确地命令它自己抛出这个异常。因此,这并不能编译:

代码语言:javascript
复制
public void test() {
    throw new IOException();
}

而这确实是:

代码语言:javascript
复制
public void test() throws IOException {
   throw new IOException();
}

请注意,通过调用声明抛出某物的方法,您将继承这个‘捕捉它或声明重新抛出它’。因此,这并不能编译:

代码语言:javascript
复制
public void test2() {
   test(); // declared to `throws IOException`
}

而这确实是:

代码语言:javascript
复制
public void test2() throws IOException {
   test();
}

请注意,public static void main(String[] args)是允许的(而且通常应该!)只被声明为throws Exception

Java还有另一条规则,解释了为什么NumberFormatException可以通过:所有方法都假定为throws RuntimeException, Error (如in一样,可以同时抛出RuntimeException和错误实例),不管您是否编写了这些实例。

检查NumberFormatException的层次结构:它是RuntimeException的专门化,因此,所有方法都被声明为throws is。CharConversionException扩展IOException扩展异常扩展Throwable -列表中的任何内容都不是RuntimeException或错误,因此不允许通过。

更糟糕的是,如果您正在实现来自超级类型的方法(如此处;您正在重写public String fromString(String arg)方法),则不能只在声明中添加新方法。毕竟,您正在编写一种StringConverter,这意味着任何人都可以将新定义的类的实例作为StringConverter来处理,而String转换器的fromString方法并不声明它,因此,您将陷入困境。

幸运的是,正如我所说的,CharConversionException是不合适的,但是IllegalArgumentException可能是合适的,而IllegalArgumentException是不受检查的(它扩展了RuntimeException,因此,您可以随意抛出它,因为所有方法都是默认的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67308837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档