Size: a a a

2020 July 05

RK

Ruslan Kolesnikov in pro.jvm
У меня есть класс Server, который содержит ServerSocket и в цикле вызывается метод accept. Насколько нормально в конструкторе вызывать метод addShutdownHook(). Который корректно закроет  serversocket по завершении программы  ?
public GambleServer(ServerSocket serverSocket,
                       ExecutorService threadPool,
                       ClientManagerFactory clientManagerFactory) {
       this.serverSocket = serverSocket;
       this.threadPool = threadPool;
       this.clientManagerFactory = clientManagerFactory;
       Runtime.getRuntime().addShutdownHook(new Thread(() -> {
           try {
               serverSocket.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }));
   }
Вот пример кода.
источник

RK

Ruslan Kolesnikov in pro.jvm
и как по другому можно вызывать метод close. Просто насколько я понимаю, если его не вызвать server сокет может некорректно закрыться. Если я правильно понимаю
источник

AE

Alexandr Emelyanov in pro.jvm
Ruslan Kolesnikov
и как по другому можно вызывать метод close. Просто насколько я понимаю, если его не вызвать server сокет может некорректно закрыться. Если я правильно понимаю
Он сам закроется при завершении jvm
источник

VP

Vladimir Petrakovich in pro.jvm
Ruslan Kolesnikov
У меня есть класс Server, который содержит ServerSocket и в цикле вызывается метод accept. Насколько нормально в конструкторе вызывать метод addShutdownHook(). Который корректно закроет  serversocket по завершении программы  ?
public GambleServer(ServerSocket serverSocket,
                       ExecutorService threadPool,
                       ClientManagerFactory clientManagerFactory) {
       this.serverSocket = serverSocket;
       this.threadPool = threadPool;
       this.clientManagerFactory = clientManagerFactory;
       Runtime.getRuntime().addShutdownHook(new Thread(() -> {
           try {
               serverSocket.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }));
   }
Вот пример кода.
Не очень нормально, лучше сделайте в этом GambleServer метод close(), который закроет сокет, пул потоков и прочие ресурсы. А за его вызов пусть отвечает тот, кто создаёт этот объект.
источник

RK

Ruslan Kolesnikov in pro.jvm
Vladimir Petrakovich
Не очень нормально, лучше сделайте в этом GambleServer метод close(), который закроет сокет, пул потоков и прочие ресурсы. А за его вызов пусть отвечает тот, кто создаёт этот объект.
Окей, спасибо
источник

RK

Ruslan Kolesnikov in pro.jvm
Alexandr Emelyanov
Он сам закроется при завершении jvm
https://stackoverflow.com/questions/17385452/serversocket-is-it-really-necessary-to-close-it вроде пишут ,что обязательно закрывать и не полагаться на jvm или os. Если я правильно понял
источник

d

d1vunit in pro.jvm
как работают исключения в JNI? Как их обрабатывать и, что происходит когда возникает исключение, программа сразу прерывает свое выполнение или доходит до return ?
источник

IO

Iaroslav Orlov in pro.jvm
d1vunit
как работают исключения в JNI? Как их обрабатывать и, что происходит когда возникает исключение, программа сразу прерывает свое выполнение или доходит до return ?
вы про плюсовые исключения?
источник

IO

Iaroslav Orlov in pro.jvm
или джавовые?
источник

d

d1vunit in pro.jvm
Iaroslav Orlov
вы про плюсовые исключения?
java
источник

IO

Iaroslav Orlov in pro.jvm
auto flag = env->ExceptionCheck(); 
if (flag) { env->ExceptionClear(); /* обработка, как в catch */ }
источник

d

d1vunit in pro.jvm
а если нужно получить сообщение ошибки
источник

d

d1vunit in pro.jvm
   auto id_excfunc = env->GetStaticMethodID(cls,"excfunc","()V");
   env->CallStaticVoidMethod(cls,id_excfunc);

   if(env->ExceptionCheck())
   {

       env->ExceptionClear();
       auto exception = env->ExceptionOccurred();
       auto id_toString = env->GetMethodID(env->GetObjectClass(exception),"toString","()Ljava/lang/String;");
       auto strexc = (jstring)env->CallObjectMethod(exception,id_toString);
       auto ptr = env->GetStringUTFChars(strexc,NULL);
       std::cout << ptr << std::endl;
       env->ReleaseStringUTFChars(strexc,ptr);
       std::cout << "in catch\n";

   }
источник

d

d1vunit in pro.jvm
у меня sigfault как мне получить сообщение об ошибки ?
источник

IO

Iaroslav Orlov in pro.jvm
d1vunit
   auto id_excfunc = env->GetStaticMethodID(cls,"excfunc","()V");
   env->CallStaticVoidMethod(cls,id_excfunc);

   if(env->ExceptionCheck())
   {

       env->ExceptionClear();
       auto exception = env->ExceptionOccurred();
       auto id_toString = env->GetMethodID(env->GetObjectClass(exception),"toString","()Ljava/lang/String;");
       auto strexc = (jstring)env->CallObjectMethod(exception,id_toString);
       auto ptr = env->GetStringUTFChars(strexc,NULL);
       std::cout << ptr << std::endl;
       env->ReleaseStringUTFChars(strexc,ptr);
       std::cout << "in catch\n";

   }
sigsegv? а никак :)
источник

IO

Iaroslav Orlov in pro.jvm
можете signal handler повесить, в принципе
источник

IO

Iaroslav Orlov in pro.jvm
d1vunit
а если нужно получить сообщение ошибки
env->ExceptionOccured вроде
источник

d

d1vunit in pro.jvm
Iaroslav Orlov
env->ExceptionOccured вроде
да , но как вызвать метод toString ?
источник

IO

Iaroslav Orlov in pro.jvm
d1vunit
да , но как вызвать метод toString ?
auto e = env->ExceptionOccured();
env->CallObjectMethod(env, e, env->GetMethodID(env, env->GetObjectClass(e), "toString", "()Ljava/lang/String;"));
источник

d

d1vunit in pro.jvm
вот рабочий код:
   auto id_excfunc = env->GetStaticMethodID(cls,"excfunc","()V");
   env->CallStaticVoidMethod(cls,id_excfunc);

   if(env->ExceptionCheck())
   {
       auto exception = env->ExceptionOccurred();
       auto id_toString = env->GetMethodID(env->GetObjectClass(exception),"toString","()Ljava/lang/String;");
       auto strexc = (jstring)env->CallObjectMethod(exception,id_toString);
       env->ExceptionClear();
       auto ptr = env->GetStringUTFChars(strexc,NULL);
       std::cout << ptr << std::endl;
       env->ReleaseStringUTFChars(strexc,ptr);
       std::cout << "in catch\n";

   }
источник