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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тут вообще кто живой есть? 
:(
    Опции темы
BushKape
Дата 7.12.2015, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2015

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



Тут есть кто живой?
PM MAIL   Вверх
samssrus
Дата 8.12.2015, 09:25 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...я снова живой, но со стороны может показаться, что я чуточку мертвый ;)
(из какой-то очень древней игры)


Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
BushKape
Дата 10.12.2015, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2015

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



Цитата(samssrus @ 8.12.2015,  09:25)
...я снова живой, но со стороны может показаться, что я чуточку мертвый ;) 
(из какой-то очень древней игры)


Этот ответ добавлен с нового Винграда - http://vingrad.com

Здравствуйте, не могли бы вы мне помочь? Есть одна ошибка в коде не как не могу разобраться в чем проблема, начал не давно основывать этот язык, был бы благодарен
PM MAIL   Вверх
AntonSaburov
Дата 10.12.2015, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Ну и где код, который надо смотреть ? И что-то странно - язык только начали осваивать, а уже в JavaCard забрались.
PM MAIL WWW ICQ   Вверх
BushKape
Дата 14.12.2015, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2015

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



Цитата(AntonSaburov @ 10.12.2015,  18:30)
Ну и где код, который надо смотреть ? И что-то странно - язык только начали осваивать, а уже в JavaCard забрались.

Нечего странного начальник указ дал и его не колышит...выворачивайся как хочешь, как говориться... Буду очень признателен за помощь, готов отблагодарить!
вот часть кода в которой ошибка:
Код

private WalletApp (byte[] bArray, short bOffset, byte bLength){
pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);
pin.update(bArray, bOffset, bLength); 
register();
}

ошибка в последней строке: variable name might not have been initialized 
саму я ошибку понимаю, но как правильно вставить значение не знаю, все перепробывал. Еще раз огромное спасибо заранее!
PM MAIL   Вверх
AntonSaburov
Дата 15.12.2015, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Судя по сообщению, код не тот - тут же написано "variable name might not have been initialized" - переменная name может оказаться не инициализирована. Т.е. код может выполниться так, что name ничего не будет присвоено. А такой переменной в коде я не вижу.
PM MAIL WWW ICQ   Вверх
BushKape
Дата 16.12.2015, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2015

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



Цитата(AntonSaburov @ 15.12.2015,  18:27)
Судя по сообщению, код не тот - тут же написано "variable name might not have been initialized" - переменная name может оказаться не инициализирована. Т.е. код может выполниться так, что name ничего не будет присвоено. А такой переменной в коде я не вижу.

вот весь код:
Код

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package WalletApp;
import javacard.framework.*;
public class WalletApp extends Applet {
final static byte WALLET_CLA = (byte)0xB0;
final static byte VERIFY = (byte) 0x20;
final static byte CREDIT = (byte) 0x30;
final static byte DEBIT = (byte) 0x40;
final static byte GET_BALANCE = (byte) 0x50;
final static short MAX_BALANCE = (short) 100000;
final static short MAX_TRANSACTION_AMOUNT = (short) 50000;
final static byte PIN_TRY_LIMIT =(byte)0x03;
final static byte MAX_PIN_SIZE =(byte)0x08;
final static short SW_VERIFICATION_FAILED = 0x6300;
final static short SW_PIN_VERIFICATION_REQUIRED = 0x6301;
final static short SW_INVALID_TRANSACTION_AMOUNT = 0x6A83;
final static short SW_EXCEED_MAXIMUM_BALANCE = 0x6A84;
final static short SW_NEGATIVE_BALANCE = 0x6A85;
final static byte GET_ACCOUNT_INFO = (byte) 41;
final static byte HASH_VALUE_LENGTH = (byte) 8;
final static byte NAME = (byte) 20;
final static byte ACCOUNT_NUMBER = (byte) 9;
final static byte EXPIRATION_DATE = (byte) 4;
private final byte[] name;
private final byte[] account_number;
private final byte[] expiration_date;
OwnerPIN pin;
short balance; 
private WalletApp(){
    name = new byte[]{};
    account_number = new byte[]{};
    expiration_date = new byte[]{};
}
/**
* called by the JCRE to create an applet instance
     * @param bArray
     * @param bOffset
     * @param bLength
*/
public static void install(byte[] bArray, short bOffset, byte bLength) {
    WalletApp walletApp = new WalletApp(bArray, bOffset, bLength);
}
private WalletApp (byte[] bArray, short bOffset, byte bLength){
pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);
pin.update(bArray, bOffset, bLength); 
register();
}
    /**
     *
     * @return
     */
public boolean select() {
 if (pin.getTriesRemaining() == 0)
 return false;
return true;
}
public void deselect() {
    pin.reset();
}

    /**
     *
     * @param apdu
     */
public void process(APDU apdu) {
    byte[] buffer = apdu.getBuffer();
    if (selectingApplet())
return;
    if (buffer[ISO7816.OFFSET_CLA] != WALLET_CLA)
ISOException.throwIt(ISO7816.SW_CLA_NOT_SUPPORTED);
    switch (buffer[ISO7816.OFFSET_INS]) {
case GET_BALANCE: getBalance(apdu); return;
case DEBIT: debit(apdu); return;
case CREDIT: credit(apdu); return;
case VERIFY: verify(apdu); return;
case GET_ACCOUNT_INFO: get_account_info(apdu); return;
default: ISOException.throwIt
(ISO7816.SW_INS_NOT_SUPPORTED);
}
}
private void credit(APDU apdu) {
   if (!pin.isValidated())
ISOException.throwIt(SW_PIN_VERIFICATION_REQUIRED);
 byte[] buffer = apdu.getBuffer();
byte numBytes = buffer[ISO7816.OFFSET_LC];
byte byteRead = (byte)(apdu.setIncomingAndReceive());
if (( numBytes != 1 ) || (byteRead != 1))
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
 byte creditAmount = buffer[ISO7816.OFFSET_CDATA];
if ((creditAmount>MAX_TRANSACTION_AMOUNT)
|| ( creditAmount < 0 ))
ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT);
 if ((creditAmount > MAX_TRANSACTION_AMOUNT)
|| (creditAmount<0))
ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT);
 balance=(short)(balance+creditAmount);
}
private void debit(APDU apdu) {
    if (! pin.isValidated())
ISOException.throwIt(SW_PIN_VERIFICATION_REQUIRED);
 byte[] buffer = apdu.getBuffer();
byte numBytes = (byte)(buffer[ISO7816.OFFSET_LC]);
byte byteRead = (byte)(apdu.setIncomingAndReceive());
if (( numBytes != 1 ) || (byteRead != 1))
ISOException.throwIt(ISO7816.SW_WRONG_LENGTH);
 byte debitAmount = buffer[ISO7816.OFFSET_CDATA];
if (( debitAmount > MAX_TRANSACTION_AMOUNT)
        || ( debitAmount < 0 ))
ISOException.throwIt(SW_INVALID_TRANSACTION_AMOUNT);
 if ((short)( balance - debitAmount )< (short)0)
ISOException.throwIt(SW_NEGATIVE_BALANCE);
 balance = (short) (balance - debitAmount);
}
private void getBalance(APDU apdu) {
byte[] buffer = apdu.getBuffer();
short le = apdu.setOutgoing();
apdu.setOutgoingLength((byte)2);
Util.setShort(buffer, (short)0, balance);
apdu.sendBytes((short)0, (short)2);
}
private void verify(APDU apdu) {
byte[] buffer = apdu.getBuffer();
byte byteRead = (byte)(apdu.setIncomingAndReceive());
if (pin.check(buffer, ISO7816.OFFSET_CDATA,byteRead)
== false)
ISOException.throwIt(SW_VERIFICATION_FAILED);
}
private void get_account_info(APDU apdu) {
short total_bytes = (short)41;
short le = apdu.setOutgoing();
apdu.setOutgoingLength(total_bytes);
apdu.sendBytesLong(name, (short)0, (short) name.length);
apdu.sendBytesLong(account_number, (short)0, (short)account_number.length);
apdu.sendBytesLong(expiration_date, (short)0,(short)expiration_date.length);
apdu.sendBytes((short)0, HASH_VALUE_LENGTH);
return;
}
}


PM MAIL   Вверх
AntonSaburov
Дата 17.12.2015, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 1
Всего: 118



Обхявлено final-поле name - private final byte[] name;

Такая переменная ДОЛЖНА обязательно инициализироваться в конструкторе или сразу при определении. Она же суд по коду устанавливается только в ОДНОМ коснтрукторе, а их ДВА. И во втором конструкторе она не инициализируется. Первый конструктор приватный и он нигде не вызывается. Второй конструктор тоже приватный, но он хоть вызывается в public static void install
Ну и получаем, что name не инициализируется, а должна.

Код

private WalletApp(){
    name = new byte[]{};
    account_number = new byte[]{};
    expiration_date = new byte[]{};
}

public static void install(byte[] bArray, short bOffset, byte bLength) {
    WalletApp walletApp = new WalletApp(bArray, bOffset, bLength);
}

private WalletApp (byte[] bArray, short bOffset, byte bLength){
    pin = new OwnerPIN(PIN_TRY_LIMIT, MAX_PIN_SIZE);
    pin.update(bArray, bOffset, bLength); 
    register();
}

PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java Card | Следующая тема »


 




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


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

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