【问题标题】:Compile test and run? Can someone give any advice?编译测试并运行?有人可以给点建议吗?
【发布时间】:2016-01-02 20:55:42
【问题描述】:

此 Java 代码应提示用户在摩尔斯电码和英语之间进行选择,然后提示他们以他们选择的语言输入字符串。然后它应该生成另一种语言的翻译。它可以在我的机器上编译,但有时不能正常工作。

其他人可以尝试为我运行它并告诉我它是否有效吗?如果没有,您能否指出我的代码中产生运行时错误的错误?

public class MorseCodeJavaProgram 
{
    public static void morse( String s3 )
    {
        int letters [ ] = new int [ 26 ];

        for ( int num = 0; num < s3.length(); num++ )
        {
            switch ( s3.charAt( num ) )
            {
                case 'a':
                    System.out.print( ".- ");
                    break;
                case 'b':
                    System.out.print( "-… ");
                    break;
                case 'c':
                    System.out.print( "-.-. ");
                    break;
                case 'd':
                    System.out.print( "-.. ");
                    break;
                case 'e':
                    System.out.print( ". ");
                    break;
                case 'f':
                    System.out.print( "..-. ");
                    break;
                case 'g':
                    System.out.print( "--. ");
                    break;
                case 'h':
                    System.out.print( "…. ");
                    break;
                case 'i':
                    System.out.print( ".. ");
                    break;
                case 'j':
                    System.out.print( ".--- ");
                    break;
                case 'k':
                    System.out.print( "-.- ");
                    break;
                case 'l':
                    System.out.print( ".-.. ");
                    break;
                case 'm':
                    System.out.print( "-- ");
                    break;
                case 'n':
                    System.out.print( "-. ");
                    break;
                case 'o':
                    System.out.print( "--- ");
                    break;
                case 'p':
                    System.out.print( ".--. ");
                    break;
                case 'q':
                    System.out.print( "--.- ");
                    break;  
                case 'r':
                    System.out.print( ".-. ");
                    break;  
                case 's':
                    System.out.print( "... ");
                    break;
                case 't':
                    System.out.print( "- ");
                    break;  
                case 'u':
                    System.out.print( "..- ");
                    break;  
                case 'v':
                    System.out.print( "...- ");
                    break;
                case 'w':
                    System.out.print( ".-- ");
                    break;
                case 'x':
                    System.out.print( "-..- ");
                    break;
                case 'y':
                    System.out.print( "-.-- ");
                    break;
                case 'z':
                    System.out.print( "--.. ");
                    break;
                case ' ':
                    System.out.print( " | ");
                    break;
            }

        }
    }

    public static void toEnglish( String s1 )
    {
        String english [ ] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z", " " };
        String morse [ ] = { ".- ", "-... ", "-.-. ", "-.. ", ". ", "..-. ", "--. ", "…. ", ".. ", ".--- ", "-.- ", ".-.. ", "-- ", "-. ", "--- ", ".--. ", "--.- ", ".-. ", "... ", "- ", "..- ", "...- ", ".-- ", "-..- ", "-.-- ", "--.. ", "| " };

        for ( int num = 0; num < s1.length(); num++ )
        {
            if ( s1.charAt ( num ) == ' ')
            {
                for ( int num2 = num; num2 < s1.length(); num2++ )
                {
                    if ( s1.charAt ( num2++ ) == ' ')
                    {
                        for ( int num3 = 0; num < 26; num3++ )
                        {
                            if ( s1.substring( num++, num2 + 2 ) == ( morse [ num3 ] ))
                            {
                                System.out.print( english [ num3 ] );
                            }
                        }
                    }

                }


            }
        }
    }

    public static void main( String [] args)
    {
        System.out.println("Begin Program");

        String s2 = Input.getString( "To Morse or From Morse" );
        if ("From Morse".equals(s2)  ){
            String s1 = Input.getString( "Please type a phrase in English" );
            toEnglish( " " + s1 + " " );
        }

        if ("To Morse".equals(s2) )
        {
            String s3 = Input.getString( "Please type a phrase in Morse Code" );
            morse( s3 );
        }
    }
}

当我收到错误消息时,它会显示“检查控制台是否有可能的错误消息,无法启动。”

下面我添加了要编译的Input.java文件到Input.class

import javax.swing.*;


public class Input
{
    public static byte getByte( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Byte.parseByte( input );
    }

    public static short getShort( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Short.parseShort( input );
    }

    public static int getInt( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Integer.parseInt( input );
    }

    public static long getLong( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Long.parseLong( input );
    }

    public static float getFloat( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Float.parseFloat( input );
    }

    public static double getDouble( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Double.parseDouble( input );
    }

    public static boolean getBoolean( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return Boolean.parseBoolean( input );
    }

    public static char getChar( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return input.charAt(0);
    }

    public static String getString( String s )
    {
        String input = JOptionPane.showInputDialog( s );
        return input;
    }

}

【问题讨论】:

  • 将您遇到的错误添加到您的问题中
  • @HocineDJEMAI 我刚刚编辑了问题以包含错误消息
  • @Rakim 以上是 Input.Class 和你的想法可能真的可以帮助我。
  • 检查控制台是否有可能的错误消息,无法启动。”本身不是错误消息。要期待答案,您必须付出最少的努力
  • @HocineDJEMAI 我已经编译并运行了程序。它运行。我输入了所有信息,但没有打印任何内容,而是弹出错误消息(带有 ! 的黄色三角形和上面的 java 咖啡杯)这正是我感到困惑的原因。我以前从未见过这种情况,并且是编码新手。请帮我。我不知道还能说什么,因为在研究之后我不明白这个错误,所以我想问其他可能的人。

标签: java testing compilation runtime-error


【解决方案1】:

嗯....当我测试代码时,它确实在尝试将莫尔斯电码翻译成英语时在 toEnglish() 方法中包含一个错误,但这绝对不是你的错误得到,我显然只有在尝试将摩尔斯电码翻译成英语时才得到例外。

我得到一个 StringIndexOutOfBoundsException 异常并且抛出异常的行是:

if ( s1.substring( num++, num2 + 2 ) == ( morse [ num3 ] ))

对于初学者,您的 english[] 字符串数组中缺少一个元素。请注意,您缺少该数组中的“w”。由于缺少一个元素,您现在在 english[] 数组和 morse[] 数组之间存在索引不匹配。我们需要确保“w”包含在 english[] 字符串数组中,否则当遇到“w”时,代码将无法翻译它。

另一件事,如果可能的话,在比较字符串时尽量避免在条件语句中使用 ==(双等号)。进入思路,改为使用 String.equals() 方法,如下所示:

if (s1.substring(num++, num2 + 2).equals(morse[num3]))

即使编译没问题,也有相当多的编码错误是由于错过了等于字符。使用 == 时还有其他问题,它们最好覆盖here

请注意,这并不能解决您在 toEnglish() 方法代码块中的错误。老实说,这段代码光看它就让我头疼,更不用说整理它的逻辑了。 @Skier1999 这里没有不尊重的意思,这是一个非常好的尝试。您对这段代码的问题是,您在 for/loop 和条件 if 语句中都增加了索引,这会使您的索引变得异常,然后最终...... StringIndexOutOfBounds 异常。

我不想在 toEnglish() 方法中修复这个逻辑,这可以通过一些调整来完成,我想提出一种不同的翻译方法。嗯,实际上两种翻译。让我们从两个字符串数组开始,english[]morse[]。我们如何废弃这些并创建一个二维数组,该数组将包含字母数字字符及其相关的摩尔斯电码等价物。可以说是一种翻译表。然后让我们将这个 2D 数组(名为 morseEnglish)放在类构造函数下,以便类中的所有方法都可以访问它。这是我建议的数组:

static String[][] morseEnglish = {{"a",".-"}, {"b","-..."}, {"c","-.-."}, {"d","-.."}, {"e","."},
        {"f","..-."}, {"g","--."}, {"h","...."}, {"i",".."}, {"j",".---"}, {"k","-.-"},
        {"l",".-.."}, {"m","--"}, {"n","-."}, {"o","---"}, {"p",".--."}, {"q","--.-"},
        {"r",".-."}, {"s","..."}, {"t","-"}, {"u","..-"}, {"v","...-"}, {"w",".--"}, 
        {"x","-..-"}, {"y","-.--"}, {"z","--.."}, {" ","|"}, {".",".-.-.-"}, {",","--..--"},
        {":","---..."}, {"?","..--.."}, {"'",".----."}, {"-", "-....-"}, {"/","-..-."}, 
        {"\"",".-..-."}, {"@",".--.-."}, {"=","-...-"}, {"(","-.--.-"}, {")","-.--.-"}, 
        {"0","-----"}, {"1",".----"}, {"2","..---"}, {"3","...--"}, {"4","....-"}, {"5","....."},
        {"6","-...."}, {"7","--..."}, {"8","---.."}, {"9","----."}};

这个数组还涵盖了摩尔斯的数字和波动。

现在让我们从 toMorse() 方法开始。让我们摆脱那些冗长的开关/案例,而只使用几个 for/loops。让我们忘记使用 charAt() 方法跳过输入文本字符串的每个字符,而是使用 String.substring() 方法.然后我们将遍历我们的 morseEnglish 2D 数组,看看我们是否可以获得每个字符的匹配项,并且当我们执行时,与该字符相关的 Morse 元素被附加到一个方便命名为 翻译。下面是 toMorse() 方法的样子:

public static void toMorse(String s3) {
    String translation = "";
    for ( int i = 0; i < s3.length(); i++ ) {
        String c = s3.substring(i, i+1);
        for (int j = 0; j < morseEnglish.length; j++){
            if (morseEnglish[j][0].equals(c)) {
                if (translation.equals("")) { translation = morseEnglish[j][1]; }
                else { translation+= " " + morseEnglish[j][1]; }
            }
        }
    }

    System.out.println("Morse Code:  " + translation);
    JOptionPane.showMessageDialog(null, translation, "English To Morse Code", JOptionPane.INFORMATION_MESSAGE);
}

那里...应该涵盖文本字符串到摩尔斯电码的翻译(转换)。现在让我们处理无论如何都会导致异常的 toEnglish() 方法。因为我们有我们的 2D 数组转换表,所以我们基本上可以做同样的事情来将摩尔斯电码字符串转换为英文(字母数字)文本。我们只是在我们的 morseEnglish 2D 数组中使用不同的索引来成功比较以获得相关的字母数字到 Morse 数据。因为每个摩尔斯电码字符序列由空格分隔,我们可以使用 String.split() 方法将整个摩尔斯电码字符串放入另一个名为 的字符串数组中>code[]这里没有 charAt() 方法)。这样我们就可以简单地遍历新的 code[] 数组,获得完整的莫尔斯字符表示并将其与我们的 2D 翻译表数组 (morseEnglish[][]) 进行比较然后拉出相关的字符元素。这是建议的 toEnglish() 方法:

public static void toEnglish(String s1) {
    String code[] = s1.split(" ");
    String translation = "";
    for (int i = 0; i < code.length; i++) {
        for (int j = 0; j < morseEnglish.length; j++){
            if (morseEnglish[j][1].equals(code[i])) {
                translation+= morseEnglish[j][0];
            }
        }
    }

    System.out.println("English:  " + translation);
    JOptionPane.showMessageDialog(null, translation, "Morse Code To English", JOptionPane.INFORMATION_MESSAGE);
}

在我看来,这更容易理解并且效率更高。还有其他方法可以执行此类操作,例如使用 Map,但我认为目前这是您最容易掌握的方法。

我还调整了您代码中的其他一些内容。 Input Class 似乎工作正常,但对于您当前使用这段代码所做的事情来说有点矫枉过正,更不用说该类对于 JOptionPane.showInputDialog() 的作用相对有限 可以真正做到,但到底是什么......它的功能。这是整个 MorseCodeJavaProgram 类

package morsecodejavaprogram;

import javax.swing.JOptionPane;

public class MorseCodeJavaProgram {
    static String[][] morseEnglish = {{"a",".-"}, {"b","-..."}, {"c","-.-."}, {"d","-.."}, {"e","."},
            {"f","..-."}, {"g","--."}, {"h","...."}, {"i",".."}, {"j",".---"}, {"k","-.-"},
            {"l",".-.."}, {"m","--"}, {"n","-."}, {"o","---"}, {"p",".--."}, {"q","--.-"},
            {"r",".-."}, {"s","..."}, {"t","-"}, {"u","..-"}, {"v","...-"}, {"w",".--"}, 
            {"x","-..-"}, {"y","-.--"}, {"z","--.."}, {" ","|"}, {".",".-.-.-"}, {",","--..--"},
            {":","---..."}, {"?","..--.."}, {"'",".----."}, {"-", "-....-"}, {"/","-..-."}, 
            {"\"",".-..-."}, {"@",".--.-."}, {"=","-...-"}, {"(","-.--.-"}, {")","-.--.-"}, 
            {"0","-----"}, {"1",".----"}, {"2","..---"}, {"3","...--"}, {"4","....-"}, {"5","....."},
            {"6","-...."}, {"7","--..."}, {"8","---.."}, {"9","----."}};

    public static void toMorse( String s3 ) {
        String translation = "";
        for ( int i = 0; i < s3.length(); i++ ) {
            String c = s3.substring(i, i+1);
            for (int j = 0; j < morseEnglish.length; j++){
                if (morseEnglish[j][0].equals(c)) {
                        if (translation.equals("")) { translation = morseEnglish[j][1]; }
                        else { translation+= " " + morseEnglish[j][1]; }
                }
            }
        }
        System.out.println("Morse Code:  " + translation);
        JOptionPane.showMessageDialog(null, translation, "English To Morse Code", JOptionPane.INFORMATION_MESSAGE);
    }

    public static void toEnglish( String s1 ) {
        String code[] = s1.split(" ");
        String translation = "";
        for (int i = 0; i < code.length; i++) {
            for (int j = 0; j < morseEnglish.length; j++){
                if (morseEnglish[j][1].equals(code[i])) {
                    translation+= morseEnglish[j][0];
                }
            }
        }
        System.out.println("English:  " + translation);
        JOptionPane.showMessageDialog(null, translation, "Morse Code To English", JOptionPane.INFORMATION_MESSAGE);
    }

    public static void main( String [] args) {
        JOptionPane.showMessageDialog(null, "Select OK To Begin Translating:", "Morse Code/English Translator", JOptionPane.INFORMATION_MESSAGE);
        System.out.println("Begin Program");
        String s2 = "";
        while (!s2.toLowerCase().equals("quit")) {
            s2 = UserInput.getString( "Enter either 'To Morse' or 'To English'.\n"
                    + "To Quit enter the word 'Quit':\n(not case sensitive)\n" );
            if (s2 == null) { break; }
            if ("to morse".equals(s2.toLowerCase())  ) {
                String s3 = UserInput.getString( "Please type a phrase in English" );
                if (s3 != null) { toMorse(s3.toLowerCase()); }
            }
            if ("to english".equals(s2.toLowerCase()) ) {
                String s1 = UserInput.getString( "Please type a phrase in Morse Code" );
                if (s1 != null) { toEnglish(s1.toLowerCase()); }
            }
        }
    }
}

希望这会有所帮助。

【讨论】:

  • 非常感谢。这有助于我更多地了解正确编写代码的方法。非常感谢您对此提供的所有帮助。有没有办法我可以用相同的信息向您发送有关另一个程序的直接消息?再一次,你对我和我的编码非常有帮助和鼓励。 @DevilsHnd
  • 非常欢迎您@Skier1999,我很高兴它在某种程度上对您有所帮助。不幸的是,我不会接受有关对特定代码项目的帮助或这些相同项目中的问题的私人消息。这就是 StackOverflow 论坛的用途。您触手可及的专业 Java 程序员世界,您需要做的就是询问。永远记住,你今天在这里解决的问题明天也会为别人解决同样的问题。振作起来 Java 程序员,你并不孤单。 :)
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多