当前位置: 首页 > 知识库问答 >
问题:

在引发此Exception的方法中引发异常

徐昕
2023-03-14

我正在使用Mojang API从Minecraft玩家的用户名返回UUID。此方法在参数(我们想要知道UUID的播放器的用户名)中接受一个字符串。为了使用API的resultat,我使用SimpleJSON库(将JSON结果解析为要返回的字符串)。

我的方法抛出2个检查过的异常:IOExeption和Parse异常,因为我想要。当错误的用户名(因此不存在用户名)时,API返回一个空JSON对象,在这种情况下,我的方法抛出一个IOException。这是我的问题,当错误的用户名在方法的参数中时,该方法抛出一个新的IOExcpetion,但通过尝试并捕获该方法,抛出的异常没有被捕获。

我的方法

public static String getUUID(String name) throws IOException, ParseException {
        URL url = new URL("https://api.mojang.com/users/profiles/minecraft/" + name);
        URLConnection uc = url.openConnection();
        BufferedReader bf = new BufferedReader(new InputStreamReader(uc.getInputStream()));
        StringBuilder response = new StringBuilder();
        String inputLine;
        while ((inputLine = bf.readLine()) != null) {
            response.append(inputLine);
        }
        bf.close();

        if (response.toString().isEmpty()) {
            throw new IOException();
        }
        JSONParser parser = new JSONParser();
        Object object = parser.parse(response.toString());
        JSONObject jo = (JSONObject) object;
        String str = (String) jo.get("id");
        return str.replaceAll("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5");
    }

使用有效用户名的示例:

public static void main(String[] args) {
        try {
            System.out.println(getUUID("Jeb_"));
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
    }

下面是一个用户名错误的示例:

public static void main(String[] args) {
        try {
            System.out.println(getUUID("d"));
        } catch (IOException | ParseException e) {
            e.printStackTrace();
        }
    }

非常感谢。

共有2个答案

管景天
2023-03-14

实际上,您的异常被捕获,您可以检查如下:

public static void main(String[] args) {
        var username = "d";
        try {
            System.out.println(getUUID(username));
        } catch (IOException | ParseException e) {
            System.out.println("User " + username + " not found!");
            e.printStackTrace();
        }
    }

程序的输出将是:

User d not found!
java.io.IOException
    at com.company.Main.getUUID(Main.java:37)
    at com.company.Main.main(Main.java:17)

此输出意味着执行了catch块中的代码。

阳枫涟
2023-03-14

您是否验证过您的异常可能会被捕获?如果它被捕获,代码会打印堆栈跟踪。但如果它没有被捕获,JVM无论如何都会打印堆栈跟踪。

因此,抛出异常并提供一些您可以验证的消息,如

throw new IOException("Invalid user");

并通过更详细一点来捕捉异常

catch (IOException | ParseException e) {
    System.out.println("Could not lookup user "+username+", caught "+e.getClass().getName()+": "+e.getMessage());
}
 类似资料:
  • 我正尝试在类的方法中使用(以支持拖放)。我想显示我拖动的文件的导入进度。然而,它并不起作用。我不明白问题是什么,或者是什么引起的。 例外情况:

  • 我正在使用JAXB XMLadapter封送和反封送布尔值。应用程序的XML文件也将被C#应用程序访问。我们必须验证这个XML文件,这是使用XSD完成的。C#应用程序为布尔节点编写“true”值。但XSD也验证了这一点,因为它只允许“true/false”或“1/0”。因此,我们在XSD中保留了布尔值的String,该String将由XMLAdapter验证,以便在我们这边进行封送和反封送。XML

  • 问题内容: 是否有可能在Java 引用上创建方法引用的原因 ?这样做可能永远是不正确的,但是会导致错误,以后很难找到: 问题答案: 是否有可能在Java 引用上创建方法引用的原因 ? 不是 ,但是Eclipse在这方面显然存在一个错误(编辑:此问题已得到修复)。根据规范,当您使用JDK的工具时,它会失败,并且在线上会出现NPE 。 证明:http://ideone.com/APWXna(或编译和本

  • 我无法在Spring中捕获异步方法抛出的异常。我已经编写了一个未捕获的异常处理程序来捕获,但没有成功。该应用程序将启用启动任意数量的永远运行的异步作业。我认为我的异步方法需要返回Future,以便我可以将其存储在hashmap中并检查其状态或停止作业。我也可以通过存储它来获取所有正在运行的作业。我认为我不能使用get method of Future,因为如果输入正确,它会阻塞,我的作业将永远运行

  • 问题内容: 我想要一种一致且简单的方法来在JNI代码中引发异常;处理链式异常的东西(隐式地来自env-> ExceptionOccurred方法,或者由参数显式表示,无论哪种方式都不错),并且每次执行此操作时都无需查找构造函数。尽管我可以根据需要从C ++进行翻译,但上述所有内容最好都用C语言编写。 SO上是否有人可以分享这样的东西? 问题答案: 我们只是为要抛出的每种异常类型编写实用程序方法。这

  • 问题内容: 这是我的代码块。 这段代码无法编译,因为我在Line1中添加了“ throws”。 编译器抱怨重写的方法不能引发异常。 为什么这样 ?。 为什么覆盖的方法不能引发异常? 因为我可以通过在子类的实现中添加n行代码来覆盖基类中的方法。 这些添加的代码会引发异常,所以为什么我不能在重写的方法中使用“引发”? 问题答案: 重写的方法可以引发Exception,只要被重写的方法也抛出相同的Exc