Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSP — с чего начать? 
V
    Опции темы
diablero
Дата 21.6.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата

Каждую переменную инициализируй дефолтным значением.

maxConnections = 90. Потому что посмотрев доки mySQL, обнаружил эту цифру, как максимально число подключений.
Исходя из своего опыта, скажи, какие должны быть значения по умолчанию?

Код

package ru.selfexpression;

import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Configuration {
    private String confFileName;
    private Properties properties;

    private String fileEncoding = "Windows-1251";
    private String encryptionKey = "Infinite";
    private int maxConnections = 90;

    public Configuration(String confFileName) {
        this.confFileName = confFileName;
        properties = new Properties();
    }
    public void load() {
        try {
            FileInputStream is = new FileInputStream(confFileName);
            properties.load(is);
            is.close();
        } catch (FileNotFoundException e) {

        } catch (IOException e) {

        }
    }
    public String getfileEncoding() {
        return properties.getProperty("file.Encoding");
    }
    public String encryptionKey() {
        return properties.getProperty("encryption.Key");
    }
    public int maxConnections() {
        return Integer.parseInt(properties.getProperty("max.Connections"));
    }
    public String toString() {
        return "Configuration: "+confFileName+"\n"+
               "File encoding: "+fileEncoding+"\n"+
               "Encryption key: "+encryptionKey+"\n"+
               "Max connections: "+maxConnections+"\n";
    }
}




Это сообщение отредактировал(а) diablero - 21.6.2007, 18:01


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 21.6.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Так-так, минутку... А что же это ты так смело присваиваешь значения переменным?

Код

            fileEncoding = properties.getProperty("file.Encoding");
            encryptionKey = properties.getProperty("encryption.Key");
            maxConnections = Integer.parseInt(properties.getProperty("max.Connections"));


 А если параметр отсутствует в пропертях? Для чего же мы тогда заводили дефолтные значения? Кроме того, если в конфиге будет пропущен параметр max.Connections, то прога вообще не запустится, так как вылетит по NullPointerException. Так что тут-то как раз проверки нужны.

И по поводу исключений. Вот мы наконец и столкнулись с ситуацией, когда игнорировать их нельзя, поскольку они чекнутые (checked). Совсем-то их молчком проглатывать, как у тебя - это тоже не дело. Давай пока сделаем так: в тех местах, где может выбрасываться чекнутое исключение, будем оборачивать его в RuntimeException и пробрасывать наверх:

Код

try {
    // some IO code here
} catch (IOException ioe {
    throw new RuntimeException(ioe);
}


В общем, надо исправить. Когда сделаешь - потести с пропущенными параметрами конфига, вплоть до полностью пустого файла. Убедись, что в этом случае подхватываются дефолтные значения.

Да, и по поводу параметра maxConnections. Если честно, совершенно пофиг, чему он будет равен. Мы все равно будем использовать пул соединений. Я просто хотел, чтобы у нас был какой-нибудь числовой параметр - чтоб служба медом не казалась smile


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 21.6.2007, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Подправил.
Код

package ru.selfexpression;

import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Configuration {
    private String confFileName;
    private Properties properties;

    private String fileEncoding = "Windows-1251";
    private String encryptionKey = "Infinite";
    private int maxConnections = 90;

    public Configuration(String confFileName) {
        this.confFileName = confFileName;
        properties = new Properties();
    }
    public void load() {
        try {
            FileInputStream fis = new FileInputStream(confFileName);
            properties.load(fis);
            fis.close();
        } catch (FileNotFoundException err) {
            throw new RuntimeException(err);
        } catch (IOException err) {
            throw new RuntimeException(err);
        }
    }
    public String getfileEncoding() {
        return properties.getProperty("file.Encoding", fileEncoding);
    }
    public String getEncryptionKey() {
        return properties.getProperty("encryption.Key", encryptionKey);
    }
    public int getMaxConnections() {
        try {
            return Integer.parseInt(properties.getProperty("max.Connections"));
        } catch(NumberFormatException err) {
            return maxConnections;
        }
    }
    public String toString() {
        return "Configuration: "+confFileName+"\n"+
               "File encoding: "+getfileEncoding()+"\n"+
               "Encryption key: "+getEncryptionKey()+"\n"+
               "Max connections: "+getMaxConnections()+"\n";
    }
}


Это сообщение отредактировал(а) diablero - 21.6.2007, 22:50


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 21.6.2007, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Вообще-то я немного не такой подход имел в виду. Я хотел бы, чтобы все параметры конфига фиксировались именно в переменных, а не вытаскивались "на лету" из пропертей. Одна из причин заключается в том, что нам может со временем понадобиться перейти на другой формат конфигурации, например XML. А коль скоро у нас доступ к параметрам уже "зашит" в коде геттеров, то придется все менять.

То есть еще раз: идеологически правильнее сделать так, чтобы класс конфигурации мало зависел от формата хранения. Для этого формато-зависимый код надо как можно сильнее локализовать и изолировать. У нас для этого есть функция load(). Тогда с переходом на другой формат мы просто перепишем этот метод - и всех делов. Если сильно захочется, можем даже оформить в виде иерархии классов. Но это в данном случае будет, пожалуй, overkill.

ЗЫ: Еще раз напоминаю: не надо редактировать код в ранее написанных постах. Люди ведь не поймут, о чем мы тут говорим.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 22.6.2007, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Подправил. Часть 2
Код

package ru.selfexpression;

import java.util.Properties;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class Configuration {
    private String confFileName;
    private Properties properties;

    private String fileEncoding = "Windows-1251";
    private String encryptionKey = "Infinite";
    private int maxConnections = 90;

    public Configuration(String confFileName) {
        this.confFileName = confFileName;
        properties = new Properties();
    }
    public void load() {
        try {
            FileInputStream fis = new FileInputStream(confFileName);
            properties.load(fis);
            fis.close();
        } catch (FileNotFoundException err) {
            throw new RuntimeException(err);
        } catch (IOException err) {
            throw new RuntimeException(err);
        }
        fileEncoding = properties.getProperty("file.Encoding", fileEncoding);
        encryptionKey = properties.getProperty("encryption.Key", encryptionKey);

        try {
            maxConnections = Integer.parseInt(properties.getProperty("max.Connections"));
        } catch(NumberFormatException err) {}
    }
    public String getfileEncoding() {
        return fileEncoding;
    }
    public String getEncryptionKey() {
        return encryptionKey;
    }
    public int getMaxConnections() {
        return maxConnections;
    }
    public String toString() {
        return "Configuration: "+confFileName+"\n"+
               "File encoding: "+getfileEncoding()+"\n"+
               "Encryption key: "+getEncryptionKey()+"\n"+
               "Max connections: "+getMaxConnections()+"\n";
    }
}




--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 22.6.2007, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Ага, теперь такой момент: зачем нам классовая переменная ptoperties? Смотри, ты объявляешь ее в одном месте, создаешь для нее объект в другом, а используешь - в третьем. У Блоха на этот счет есть даже отдельное правило:

Цитата
Item 29: Minimize the scope of local variables

By minimizing the scope of local variables, you increase the readability and maintainability of your code and reduce the likelihood of error.

... 

The most powerful technique for minimizing the scope of a local variable is to declare it where it is first used.  If a variable is declared before it is used, it is just clutter—one more thing to distract the reader who is trying to figure out what the program does. By the time the variable is used, the reader might not remember the variable's type or initial value. If the program evolves and the variable is no longer used, it is easy to forget to remove the declaration if it's far removed from the point of first use.


А Блох - это товарищ, который знает, о чем говорит smile

Когда ты сделаешь переменную properties локальной для блока try, ты перестанешь ее видеть в том месте, где у тебя извлекаются значения параметров. Пофиксить можно переносом этих строк вовнутрь блока try.

И еще по поводу параметра max.Connections. У тебя сейчас вот так:

Код

        try {
            maxConnections = Integer.parseInt(properties.getProperty("max.Connections"));
        } 


Но тут по-хорошему надо бы различать два случая - когда параметр просто отсутствует, и когда он не является валидным целым. В первом случае надо просто присвоить дефолтное значение, а во втором - это на усмотрение. Я бы так и не ловил его вовсе, благо оно не чекнутое, или ловил и оборачивал в другой RuntimeException, с подробным указанием причины.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 22.6.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Код

    public void load() {
        try {
            Properties properties = new Properties();
            FileInputStream fis = new FileInputStream(confFileName);
            properties.load(fis);
            fis.close();

            fileEncoding = properties.getProperty("file.Encoding", fileEncoding);
            encryptionKey = properties.getProperty("encryption.Key", encryptionKey);

            try {
                maxConnections = Integer.parseInt(properties.getProperty("max.Connections"));
            } catch(NumberFormatException err) {
                throw new RuntimeException("Parameter \"maxConnections\" has a wrong format");    
            }
        } catch (FileNotFoundException err) {
            throw new RuntimeException(err);
        } catch (IOException err) {
            throw new RuntimeException(err);
        }
    }

Давай оставим пока так. А позже уже определимся куда и что будем делать со всеми исключениями.


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
diablero
Дата 22.6.2007, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Цитата(Stampede @  22.6.2007,  00:45 Найти цитируемый пост)
Но тут по-хорошему надо бы различать два случая - когда параметр просто отсутствует, и когда он не является валидным целым.

Понял всю глубину. Такая задержка в понимание из-за столь позднего времени. smile
Уже скоро на работу, посплю чуток. Днем подправлю.
Может еще одно задание?smile


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 22.6.2007, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(diablero @  21.6.2007,  16:25 Найти цитируемый пост)
Может еще одно задание?smile 


Нет, нам нужно сначала подвести важную черту. Зафиксировать, тыкскыть, достигнутое. Так что до завтра.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
batigoal
Дата 22.6.2007, 07:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 16
Всего: 151



Цитата(Stampede @  22.6.2007,  00:55 Найти цитируемый пост)
Вообще-то я немного не такой подход имел в виду. Я хотел бы, чтобы все параметры конфига фиксировались именно в переменных, а не вытаскивались "на лету" из пропертей. Одна из причин заключается в том, что нам может со временем понадобиться перейти на другой формат конфигурации, например XML. А коль скоро у нас доступ к параметрам уже "зашит" в коде геттеров, то придется все менять.

Я обычно решаю эту проблему так: создаю класс Config, а в нем - внутренний класс ConfigReader. В случае изменения формата хранения - будет правиться ConfigReader, который никем, кроме самого Config не используется --> хорошо локализован.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Stampede
Дата 22.6.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



Цитата(batigoal @  21.6.2007,  22:22 Найти цитируемый пост)
Я обычно решаю эту проблему так: создаю класс Config, а в нем - внутренний класс ConfigReader. В случае изменения формата хранения - будет правиться ConfigReader, который никем, кроме самого Config не используется --> хорошо локализован.


Вот, обрати внимание, diablero - batigoal приводит очень хороший пример разбиения компонентов по границе функциональной ответственности, причем имено в технике ООП, специфической для Java - с использованием внутрених классов. Это и есть то, что называется "слабо связанными" (loosely coupled) компонентами.

Тут уже нетрудно увидеть, как можно развить этот подход таким образом, чтобы вообще ничего не править, а просто по мере надобности использовать тот или иной ридер конфига. Например, завести отдельно:
  • PropertiesConfigReader
  • XMLConfigReader
И сделать к ним этакую мини-фабричку, хотя бы просто в форме отдельного метода или куска кода:

Код

protected ConfigReader getConfigReader(String fileName) {
    ConfigReader reader = null;
    if (fileName.endsWith('.properties')) {
        reader = new PropertiesConfigReader();
    } else if (fileName.endsWith(".xml")) {
       reader = new XMLConfigReader();
    } else {
        throw new InvalidArgumentException("Unsupported config file format: " + fileName);
    }

    return reader;
}


Но тут я еще раз напоминаю, что мы не пытаемся написать компонент общего назначения, и раньше времени вводить излишнюю гибкость нам ни к чему. В английском языке есть хорошая поговорка: "we'll cross that bridge when we come to it" (когда дойдем до моста, тогда и будем по нему переходить). Она хорошо передает суть "шустрого программирования"(agile programming) - начинай с самой простой реализации, которая только будет работать. Важно только, чтобы в этой реализации было как можно меньше "закладок", которые впоследствие затруднят нам функциональное дробление компонент, как это имело место с твоей ранней версией получения параметров конфига.

А вообще в борьбе внутреннего Шустрого Программиста и ОО Архитектора внутри себя, программист должен доминировать безоговорочно, и если что - не стесняясь бить архитектора по рукам, чтоб не терял чувства реальности smile

batigoal, спасибо за удачное развитие темы.

Это сообщение отредактировал(а) Stampede - 22.6.2007, 12:19


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 22.6.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



мини-фабричка
Код

package ru.selfexpression;

public class Configuration {
    private ConfigReader reader;
    private String confFileName;

    public Configuration(String confFileName) {
        this.confFileName = confFileName;
    }
    protected ConfigReader getConfigReader(String confFileName) {
        this.confFileName = confFileName;
        reader = null;
        if (confFileName.endsWith(".properties")) {
            reader = new PropertiesConfigReader(confFileName);
        } else if (confFileName.endsWith(".xml")) {
            reader = new XMLConfigReader(confFileName);
        } else {
            throw new IllegalArgumentException("Unsupported config file format: " + confFileName);
        }
        return reader;
    }
    public void load() {
        getConfigReader(confFileName).load();
    }
    public String getfileEncoding() {
        return reader.getfileEncoding();
    }
    public String getEncryptionKey() {
        return reader.getEncryptionKey();
    }
    public int getMaxConnections() {
        return reader.getMaxConnections();
    }
    public String toString() {
        return reader.toString();
    }
}

Код

package ru.selfexpression;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class PropertiesConfigReader extends ConfigReader {
    private String fileName;
    private String fileEncoding, encryptionKey;
    private int maxConnections;
    public PropertiesConfigReader(String fileName) {
        this.fileName = fileName;
    }
    public void load() {
        try {
            Properties properties = new Properties();
            FileInputStream fis = new FileInputStream(fileName);
            properties.load(fis);
            fis.close();

            fileEncoding = properties.getProperty("file.Encoding", defaultFileEncoding);
            encryptionKey = properties.getProperty("encryption.Key", defaultEncryptionKey);
            try {
                maxConnections = Integer.parseInt(properties.getProperty("max.Connections", String.valueOf(defaultMaxConnections)));
            } catch (NumberFormatException err) {
                throw new RuntimeException("Parameter \"maxConnections\" has a wrong format");
            }

        } catch (FileNotFoundException err) {
            throw new RuntimeException(err);
        } catch (IOException err) {
            throw new RuntimeException(err);
        }
    }
    public String getfileEncoding() {
        return fileEncoding;
    }
    public String getEncryptionKey() {
        return encryptionKey;
    }

    public int getMaxConnections() {
        return maxConnections;
    }
    public String toString() {
        return "Configuration: "+fileName+"\n"+
               "File encoding: "+getfileEncoding()+"\n"+
               "Encryption key: "+getEncryptionKey()+"\n"+
               "Max connections: "+getMaxConnections()+"\n";
    }
}

Код

package ru.selfexpression;

abstract class ConfigReader {

    public static final String defaultFileEncoding = "Windows-1251";
    public static final String defaultEncryptionKey = "Infinite";
    public static final int defaultMaxConnections = 190;

    abstract public void load();
    abstract public String getfileEncoding();
    abstract public String getEncryptionKey();
    abstract public int getMaxConnections();
}


Это сообщение отредактировал(а) diablero - 22.6.2007, 13:26


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 22.6.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



НЕТ, НЕТ, НЕПРАВИЛЬНО!

Я же говорю, НЕ НАДО раньше времени ваять лишний ООП! Пожалуйста, верни все как было, у тебя же уже все было почти хорошо, за исключением чтения maxConnections.

А если уж говорить о разбивке на классы... Зачем ты перенес переменные в ридеры? Переменные конфигурации должны быть именно в классе конфигурации.

Поясняю еще раз. Вот есть класс конфигурации. Он знает (и может выдавать) только те переменные, которые мы в нем пропишем. Как эти переменные инициализируется, откуда берутся значения для них - его не колышет абсолютно, для этого есть вспомогательные классы-ридеры. И ридеры не дублируют переменные конфига - они работают непосредственно с приватными полями класса Configuration. Поэтому-то batigoal и подчеркивал, что классы объявлены как внутренние - чтобы у них был доступ к этим полям.

Но я еще раз повторяю, не надо нам этого пока. Так что вертай все взад.



--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
diablero
Дата 22.6.2007, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 3.12.2006
Где: Аркхэм

Репутация: 2
Всего: 5



Вернул как было, и исправил ситуацию с maxConnections
Код

package ru.selfexpression;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;

public class Configuration {
    private String confFileName;
    private Properties properties;
    private String fileEncoding = "Windows-1251";
    private String encryptionKey = "Infinite";
    private int maxConnections = 90;

    public Configuration(String confFileName) {
        this.confFileName = confFileName;
        properties = new Properties();
    }
    public void load() {
        try {
            FileInputStream fis = new FileInputStream(confFileName);
            properties.load(fis);
            fis.close();
        } catch (FileNotFoundException err) {
            throw new RuntimeException(err);
        } catch (IOException err) {
            throw new RuntimeException(err);
        }
        fileEncoding = properties.getProperty("file.Encoding", fileEncoding);
        encryptionKey = properties.getProperty("encryption.Key", encryptionKey);
        try {
            maxConnections = Integer.parseInt(properties.getProperty("max.Connections", String.valueOf(maxConnections)));
        } catch (NumberFormatException err) {
            throw new RuntimeException("Parameter \"maxConnections\" has a wrong format");
        }
    }
    public String getfileEncoding() {
        return fileEncoding;
    }
    public String getEncryptionKey() {
        return encryptionKey;
    }
    public int getMaxConnections() {
        return maxConnections;
    }
    public String toString() {
        return "Configuration: " + confFileName + "\n" +
                "File encoding: " + getfileEncoding() + "\n" +
                "Encryption key: " + getEncryptionKey() + "\n" +
                "Max connections: " + getMaxConnections() + "\n";
    }
}
 


--------------------
Есть два варианта решения проблемы - реальный и фантастический. Реальный - это когда прилетят инопланетяне и все за нас сделают ...
PM MAIL   Вверх
Stampede
Дата 22.6.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гносеолог
**


Профиль
Группа: Участник Клуба
Сообщений: 963
Регистрация: 25.4.2005
Где: Calgary, Alberta, Canada

Репутация: 66
Всего: 144



И опять неправильно. Правильно (почти) было в том вариенте, который ты запостил перед тем как пойти спать. Вот этот вот:

Код

    public void load() {
        try {
            Properties properties = new Properties();
            FileInputStream fis = new FileInputStream(confFileName);
            properties.load(fis);
            fis.close();
            fileEncoding = properties.getProperty("file.Encoding", fileEncoding);
            encryptionKey = properties.getProperty("encryption.Key", encryptionKey);
            try {
                maxConnections = Integer.parseInt(properties.getProperty("max.Connections"));
            } catch(NumberFormatException err) {
                throw new RuntimeException("Parameter \"maxConnections\" has a wrong format");    
            }
        } catch (FileNotFoundException err) {
            throw new RuntimeException(err);
        } catch (IOException err) {
            throw new RuntimeException(err);
        }
    }


Там все, что нужно доделать - это проверять на null значение properties.getProperty("max.Connections"), и обрабатывать отдельно. Ты же говоришь, что понял этот момент.

diablero, может ты не выспался? Я серьезно.

Добавлено через 3 минуты и 59 секунд
diablero, извини, не заметил вот это: String.valueOf(maxConnections).

Значит, осталась только классовая переменная properties.


--------------------
"If you want something done right, do it yourself"
По секрету: выучить английский - реально!
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.1045 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.