抛出异常并通过子类实现

发布于 2025-01-08 06:01:57 字数 2495 浏览 0 评论 0原文

我正在尝试创建一个名为 HashException 的 java.lang.RuntimeException 子类,并且必须修改 NumStream 以在 NumStream 类遇到哈希字符 (#) 时抛出它。不太确定如何实现这个,我有一些东西,它确实抛出了异常,但我想知道是否有一个更干净的方法来实现这个,或者即使我做得正确。

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

class HashException extends java.lang.RuntimeException
{
    public void write(int c)
    {
        if(c == 35) throw new RuntimeException("This is a Hash Tag!");
    }
}

public class NumStream extends OutputStream
{
    public void write(int c) throws IOException
    {  
        StringBuffer sb = new StringBuffer();

        HashException h = new HashException();
        h.write(c);

        switch(c)
        {
            case ' ': sb.append(" ");
                break;
            case '1': sb.append("One");
                break;
            case '2': sb.append("Two");
                break;
            case '3': sb.append("Three");
                break;
            case '4': sb.append("Four");
                break;                
            case '5': sb.append("Five");
                break; 
            case '6': sb.append("Six");
                break;
            case '7': sb.append("Seven");
                break;
            case '8': sb.append("Eight");
                break;     
            case '9': sb.append("Nine");
                break; 
            case '0': sb.append("Zero");
                break;
            default:  sb.append(Integer.toString(c));
                break;
        }
        System.out.print(sb);
    }
    public static void main(String[] args) 
    {
        NumStream ns = new NumStream();
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(ns));
        pw.println("123456789 and ! and # ");
        pw.flush();
    }
}

这是我的输出:

run:
Exception in thread "main" java.lang.RuntimeException: This is a Hash Tag!
    at HashException.write(NumStream.java:8)
    at NumStream.write(NumStream.java:19)
OneTwoThreeFourFiveSixSevenEightNine and ! and  at     java.io.OutputStream.write(OutputStream.java:116)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
    at java.io.PrintWriter.flush(PrintWriter.java:320)
    at NumStream.main(NumStream.java:54)
Java Result: 1

I'm trying to create a subclass of java.lang.RuntimeException called HashException and I have to modify NumStream to throw it when my NumStream class encounters the hash character(#). Not too sure how to implement this, I have some stuff and it does throw the exception but I'm wondering if there's a cleaner way to implement this or even if I'm doing it correctly.

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

class HashException extends java.lang.RuntimeException
{
    public void write(int c)
    {
        if(c == 35) throw new RuntimeException("This is a Hash Tag!");
    }
}

public class NumStream extends OutputStream
{
    public void write(int c) throws IOException
    {  
        StringBuffer sb = new StringBuffer();

        HashException h = new HashException();
        h.write(c);

        switch(c)
        {
            case ' ': sb.append(" ");
                break;
            case '1': sb.append("One");
                break;
            case '2': sb.append("Two");
                break;
            case '3': sb.append("Three");
                break;
            case '4': sb.append("Four");
                break;                
            case '5': sb.append("Five");
                break; 
            case '6': sb.append("Six");
                break;
            case '7': sb.append("Seven");
                break;
            case '8': sb.append("Eight");
                break;     
            case '9': sb.append("Nine");
                break; 
            case '0': sb.append("Zero");
                break;
            default:  sb.append(Integer.toString(c));
                break;
        }
        System.out.print(sb);
    }
    public static void main(String[] args) 
    {
        NumStream ns = new NumStream();
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(ns));
        pw.println("123456789 and ! and # ");
        pw.flush();
    }
}

This is my output:

run:
Exception in thread "main" java.lang.RuntimeException: This is a Hash Tag!
    at HashException.write(NumStream.java:8)
    at NumStream.write(NumStream.java:19)
OneTwoThreeFourFiveSixSevenEightNine and ! and  at     java.io.OutputStream.write(OutputStream.java:116)
    at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
    at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
    at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
    at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
    at java.io.PrintWriter.flush(PrintWriter.java:320)
    at NumStream.main(NumStream.java:54)
Java Result: 1

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

把人绕傻吧 2025-01-15 06:01:57

检查可能应该在您的 numstream 类中。如果遇到哈希则抛出哈希异常。像这样:

 switch(c) {
            case '#':
                throw new HashException();
            case ' ': sb.append(" ");
                break;
            case '1': sb.append("One");
                break;
            case '2': sb.append("Two");
                break;
            case '3': sb.append("Three");
                break;
            case '4': sb.append("Four");
                break;                
            case '5': sb.append("Five");
                break; 
            case '6': sb.append("Six");
                break;
            case '7': sb.append("Seven");
                break;
            case '8': sb.append("Eight");
                break;     
            case '9': sb.append("Nine");
                break; 
            case '0': sb.append("Zero");
                break;
            default:  sb.append(Integer.toString(c));
                break;
        }

您也可以在 HashException 类中声明 Exception message

class HashException extends Exception
{
    public HashException() {
       super("A hash was encountered!");
    }
}

请注意,HashException 可能应该扩展 Exception,而不是 RuntimeException

The check should probably be in your numstream class. If that encounters a hash then throw a hash exception. Like this:

 switch(c) {
            case '#':
                throw new HashException();
            case ' ': sb.append(" ");
                break;
            case '1': sb.append("One");
                break;
            case '2': sb.append("Two");
                break;
            case '3': sb.append("Three");
                break;
            case '4': sb.append("Four");
                break;                
            case '5': sb.append("Five");
                break; 
            case '6': sb.append("Six");
                break;
            case '7': sb.append("Seven");
                break;
            case '8': sb.append("Eight");
                break;     
            case '9': sb.append("Nine");
                break; 
            case '0': sb.append("Zero");
                break;
            default:  sb.append(Integer.toString(c));
                break;
        }

You can also just declare the Exception message within the HashException class:

class HashException extends Exception
{
    public HashException() {
       super("A hash was encountered!");
    }
}

Note that HashException should probably extend Exception, not RuntimeException.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文