Вы знаете хорошей программы для редактирования/перевода ресурса (.rc) файлы?

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть NullPointerException. Как вы это исправите? Возьмем простой пример, который выдает NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

Идентифицирует нулевые значения

. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

Здесь мы видим, что исключение выбрано в строке 13 (в методе printString). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, что s имеет значение null, а вызов метода length на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когда s.length() удаляется из метода.

Трассировка, где эти значения взяты из

Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что s передается с printString(name) в методе print(), а this.name - null.

Трассировка, где эти значения должны быть установлены

Где установлен this.name? В методе setName(String). С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. ​​

Этого достаточно, чтобы дать нам решение: добавить вызов printer.setName() перед вызовом printer.print().

Другие исправления

Переменная может иметь значение по умолчанию setName может помешать ему установить значение null):

private String name = "";

Либо метод print, либо printString может проверить значение null например:

printString((name == null) ? "" : name);

Или вы можете создать класс, чтобы name всегда имел ненулевое значение :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

См. также:

Я все еще не могу найти проблему

Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).

8
задан djeidot 9 September 2008 в 17:42
поделиться

12 ответов

Проверьте Локализатор Lingobit. Дорогой, но определенно стоящий того.

2
ответ дан 5 December 2019 в 20:20
поделиться

ResxCrunch будет скоро отсутствовать, он отредактирует несколько файлов ресурсов на нескольких языках в одной единственной таблице.

-1
ответ дан 5 December 2019 в 20:20
поделиться

Руководящая локализация и переводы с помощью .rc файлы и Visual Studio не являются хорошей идеей. Намного более умно (хотя парадоксальный) запустить локализацию через exe. Читайте здесь почему: http://www.apptranslator.com/misconceptions.html

0
ответ дан 5 December 2019 в 20:20
поделиться

Также попытка AppTranslator: http://www.apptranslator.com/. Это имеет сборку - в редакторе ресурса так, чтобы переводчики могли, например, enlargen текстовое поле когда филиал потребности. Это имеет отдельные версии для разработчиков и переводчиков и многое другое.

0
ответ дан 5 December 2019 в 20:20
поделиться

Вы могли бы смотреть на http://www.sisulizer.com Sisulizer. Дорогой все же. Мы оцениваем его для использования в моей компании для управления головной болью непрерывного перевода. Я читал на их странице About, что компания была основана людьми, которые покинули Multilizer и другие подобные компании.

2
ответ дан 5 December 2019 в 20:20
поделиться

Мы используем Multilizer (http://www.multilizer.com/) и хотя иногда это немного хитро для использования, в конце с небольшим количеством пациента это работает вполне прилично.

У нас даже есть веб-сайт перевода, где переводчики могут загрузить наши проекты и затем загрузить переводы использующие функции командной строки Multilizer.

0
ответ дан 5 December 2019 в 20:20
поделиться

Если бы нет один, было бы довольно легко циклично выполнить через все строки в ресурсе сравнивание их к международным ресурсам. Вы могли, вероятно, сделать это с простой сеткой.

0
ответ дан 5 December 2019 в 20:20
поделиться

RC-WinTrans выезда. Это - коммерческий инструмент, который использует моя компания. Это в основном импортирует наши.RC файлы (или .resx файлы) в базу данных, которую мы отправляем в другой офис для перевода. Инструмент может затем экспортировать переведенный.RC файл (или .resx файл) для каждого языка от базы данных. Это даже имеет основного редактора диалогового окна, таким образом, переводчик может скорректировать размер различных средств управления в диалоговом окне, чтобы быть уверенным соответствия переведенного текста.

Это также принимает много параметров командной строки и имеет интерфейс автоматизации COM, таким образом, можно интегрировать его в процесс сборки более легко. Это работает вполне хорошо на нас, и у нас буквально есть тысячи и тысячи строк и диалоговых окон и т.д.

(У нас в настоящее время есть версия 7 поэтому, что я сказал, могло бы немного отличаться, чем их последняя версия 8.)

0
ответ дан 5 December 2019 в 20:20
поделиться

По моему опыту, интернационализация требует немного больше, чем перевод строк. Много строк при переводе требуют большего количества пространства на диалоговом окне. Из-за этого полезно смочь настроить диалоговые окна для каждого языка. Иначе необходимо создать диалоговые окна с дополнительным пространством для переведенных строк, которое затем выглядит менее, чем оптимальным при отображении на английском языке.

Долгое время назад я использовал инструментальное средство для перевода для приложения MFC, но компания, которая произвела программное обеспечение, прекратила продавать его. Когда я пытался найти замену по умеренной цене, я не нашел тот.

1
ответ дан 5 December 2019 в 20:20
поделиться

Проверьте appTranslator, его относительно дешевое, и работает скорее хорошо. Парень, разрабатывающий его, является действительно быстро реагирующим к запросам улучшения и отчету об ошибках, таким образом, Вы получаете действительно хорошую поддержку.

2
ответ дан 5 December 2019 в 20:20
поделиться

Вот сценарий, который я использую для генерации файлов ресурсов для тестирования на различных языках. Это просто анализирует ответ от babelfish так же ясно, перевод будет почти столь же высококачественным как тот сделанный пьяной обезьяной, но это полезно для тестирования и такого


for i in $trfile
do
    key=`echo $i | sed 's/^\(.*\)=\(.*\)$/\1/g'`
    value=`echo $i | sed 's/^\(.*\)=\(.*\)$/\2/g'`
    url="http://babelfish.altavista.com/tr?doit=done&intl=1&tt=urltext&lp=$langs&btnTrTxt=Translate&trtext=$value"
    wget -O foo.html -A "$agent" "$url" *&> /dev/null
    tx=`grep "<td bgcolor=white class=s><div style=padding:10px;>" foo.html`
    tx=`echo $tx | iconv -f latin1 -t utf-8 | sed 's/<td bgcolor=white class=s><div style=padding:10px;>\(.*\)<\/div><\/td>/\1/g'`
    echo $key=$tx
done

rm foo.html
2
ответ дан 5 December 2019 в 20:20
поделиться

В конце мы закончили тем, что создали наши собственные внешние инструменты для управления этим. Наша работа devs в английской таблице строк и каждой автоматизированной сборке отправляет наши строки, которые были добавлены/изменены и удалены менеджеру по переводу. Он может также выполнить отчет в любое время от старой сборки для определения то, что требуется для перевода.

0
ответ дан 5 December 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: