【问题标题】:Throwing exceptions and implementing through subclass抛出异常并通过子类实现
【发布时间】:2012-02-24 02:01:54
【问题描述】:

我正在尝试创建一个名为 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

【问题讨论】:

    标签: java exception throw


    【解决方案1】:

    检查可能应该在您的 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 类中声明异常message

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

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

    【讨论】:

    • 你能解释一下super吗?我猜它就像一个打印命令,但你为什么使用它而不是 System.out.print?
    • 另外,当我尝试你给我的代码时,异常没有出现?是什么原因造成的?
    • 啊非易失性!我想到了!谢谢大家的帮助!
    • 对不起,我去睡觉了。 super() 调用HashException 的超类的构造函数。在这种情况下,Exception 类。
    猜你喜欢
    • 2023-03-07
    • 2015-06-03
    • 1970-01-01
    • 2013-03-14
    • 2016-06-21
    • 2012-04-22
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多