Kamio_Mur
@Kamio_Mur
Новичок

Почему программа может неправильно работать при запуске в jar?

Была задача: "дано предложение. Верно ли, что самое длинное его слово имеет больше 10 символов?"
Вот мое решение
package com.company;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex {
    public static void main(String[] args) throws IOException {

    BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in));
    int  charCount,  maxCharCount,  wordsCount;
    double  ch;
    System.out.println("Введите  слова,  разделенные  пробелами");
    System.out.println("В  конце  предложения  поставьте  точку");
    maxCharCount  =  wordsCount  =0;
    do  {
        charCount  =  0;
        ch  =  '*';
        while  ((ch  !=  ' ')  &&  (ch  !=  ',')  &&  (ch  !=  '.'))  {//Конец  слова
            ch  =  stdInBReader.read();
            if  ((('А'  <=  ch)  &&  (ch  <=  'Я'))  ||
                    ((('а'  <=  ch)  &&  (ch  <=  'п'))  ||
                            (('р'  <=  ch)  &&  (ch  <=  'я'))))
                charCount++;
        }
        wordsCount  +=  (ch  ==  ',')  ?  0  :  1;
        if  (maxCharCount  <  charCount)  maxCharCount  =  charCount;
    }
    while  (ch  !=  '.');
    System.out.println(maxCharCount <= 10 ? "Неверно. Число  букв  в  самом  длинном  слове:  "  +  maxCharCount : "Верно. Число  букв  в  самом  длинном  слове:  "  +  maxCharCount );
    System.out.println("Число  обработанных  слов:  "  +  wordsCount);
}
}


При запуске в Intellij IDEA программа работает правильно. Верно подсчитывает буквы в длинном слове и выдает этот результат. Затем эту программу выгрузил в jar и запустил с помощью bat файлика. На что выходит такое: 5a40e34b9ce39070284626.jpeg5a40e35b5ecab146283265.jpeg
Т.е. Он правильно считает количество слов, но вот с количеством букв происходит что-то невразумительное. Даже если слово больше 10 букв, он выдает "Неверно" вместо "Верно". Похоже, что и условие неправильно проверяется. Подскажите, в чем может быть причина? Может еще что-то имортнуть нужно? Все остальные программы в jar адекватно работают, проблема только с этим кодом.
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Java
Седой и строгий
В программе у вас символы закодированы в utf-8, а из консоли вы считываете в cp866. Естественно, условия в if не срабатывают. Решение в лоб относительно простое - указать кодировку потока ввода:

BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in, "cp866"));

Но у этого решения есть существенный минус - пропадает кроссплатформенность, основная фишка Java. Это решить уже сложнее. Придётся либо получать кодировку от пользователя в качестве параметра:

String encoding = System.getProperty("console.encoding", "utf-8");
BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in, encoding));

Теперь пользователь может указать кодировку при запуске
java -Dconsole.encoding=cp866 Ex
а если не укажет, то будет utf-8.

Либо использовать грязный хак, который может не работать на JVM отличных от HotSpot или не работать на других версиях HotSpot:

import java.io.Console;
import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException;

public class Ex {
    private static final String encoding;

    static {
        String e = null;
        try {
            final Class<Console> clazz = Console.class;
            final Method method = clazz.getDeclaredMethod("encoding", new Class[0]);
            method.setAccessible(true);
            e = (String) method.invoke(null);
        }
        catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException exc) {}
        finally {
            encoding = e;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader stdInBReader  =  new  BufferedReader(new InputStreamReader(System.in, encoding));
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы